home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / dialslid.i < prev    next >
Text File  |  1997-10-26  |  20KB  |  605 lines

  1. IMPLEMENTATION MODULE DialSlider;
  2.  
  3. FROM SYSTEM     IMPORT ADR, ADDRESS, CADR, TSIZE, CALLSYS;
  4. FROM Storage    IMPORT ALLOCATE, DEALLOCATE;
  5.  
  6. FROM mtUtils    IMPORT tRect;
  7. FROM mtAppl     IMPORT CharWidth, CharHeight;
  8.  
  9. IMPORT MagicAES, mtAppl, mtRsc, mtUtils, ListUtils, BinOps;
  10.  
  11. (*----------------------------------------------------------------------*
  12.  *        Resource-Coder 1.03  (C)92 by Peter Hellinger Software        *
  13.  *----------------------------------------------------------------------*
  14.  *           Inline-Resource erzeugt am 12.10.1992 14:21:20             *
  15.  *----------------------------------------------------------------------*)
  16.  
  17. TYPE tRscData = ARRAY [0..142] OF CARDINAL;
  18.  
  19. CONST RscData = tRscData {
  20.         00000H, 0002CH, 0011CH, 0011CH, 0011CH, 0011CH, 0011CH, 0011CH, 0011CH, 
  21.         00024H, 0000AH, 00002H, 00000H, 00000H, 00000H, 00000H, 00000H, 0011CH, 
  22.         00000H, 0002CH, 00000H, 000A4H, 0FFFFH, 00001H, 00003H, 00014H, 00000H, 
  23.         00000H, 000FFH, 01100H, 00000H, 00000H, 00002H, 0000CH, 00002H, 0FFFFH, 
  24.         0FFFFH, 0001BH, 00000H, 00000H, 001FFH, 01100H, 00000H, 00000H, 00002H, 
  25.         00001H, 00003H, 0FFFFH, 0FFFFH, 0001BH, 00000H, 00000H, 002FFH, 01100H, 
  26.         00000H, 0000BH, 00002H, 00001H, 00000H, 00004H, 00004H, 00014H, 00040H, 
  27.         00000H, 000FFH, 01111H, 00000H, 00001H, 00002H, 0000AH, 00003H, 0FFFFH, 
  28.         0FFFFH, 00014H, 00060H, 00000H, 000FFH, 01100H, 00000H, 00000H, 00002H, 
  29.         00002H, 0FFFFH, 00001H, 00003H, 00014H, 00000H, 00000H, 000FFH, 01100H, 
  30.         00000H, 00000H, 00012H, 00001H, 00002H, 0FFFFH, 0FFFFH, 0001BH, 00040H, 
  31.         00000H, 004FFH, 01100H, 00000H, 00000H, 00002H, 00001H, 00003H, 0FFFFH, 
  32.         0FFFFH, 0001BH, 00040H, 00000H, 003FFH, 01100H, 00010H, 00000H, 00002H, 
  33.         00001H, 00000H, 00004H, 00004H, 00014H, 00040H, 00000H, 000FFH, 01111H, 
  34.         00002H, 00000H, 0000EH, 00001H, 00003H, 0FFFFH, 0FFFFH, 00014H, 00060H, 
  35.         00000H, 000FFH, 01100H, 00000H, 00000H, 00006H, 00001H, 00000H
  36.         }; (* Ende RscData *)
  37. CONST
  38.  
  39.     Form1    =   0;    (* Formular/Dialog *)
  40.     Gup      =   1;    (* BUTTON in Baum FORM1 *)
  41.     Gdown    =   2;    (* BUTTON in Baum FORM1 *)
  42.     Gvbar    =   3;    (* BOX in Baum FORM1 *)
  43.     Gvslid   =   4;    (* BOX in Baum FORM1 *)
  44.  
  45.     Form2    =   1;    (* Formular/Dialog *)
  46.     Gleft    =   1;    (* BOXCHAR in Baum FORM2 *)
  47.     Gright   =   2;    (* BOXCHAR in Baum FORM2 *)
  48.     Ghbar    =   3;    (* BOX in Baum FORM2 *)
  49.     Ghslid   =   4;    (* BOX in Baum FORM2 *)
  50.     
  51.     parent   =   3;
  52.     slider   =   4;
  53. (*----------------------------------------------------------------------*)
  54.  
  55. TYPE SLIDER = POINTER TO SLIDSPEC;
  56.  
  57.      SliderTree = ARRAY [0..4] OF MagicAES.OBJECT;
  58.  
  59.      SLIDSPEC   = RECORD
  60.                     hori        : BOOLEAN;
  61.                     accel       : INTEGER;
  62.                     scale       : LONGINT;
  63.                     position    : LONGINT;
  64.                     size        : INTEGER;
  65.                     step        : INTEGER;
  66.                     ob          : SliderTree;
  67.                     drawn       : BOOLEAN;
  68.                   END;
  69.  
  70. VAR 
  71.         vertSlidTree,
  72.         horiSlidTree    : POINTER TO SliderTree;
  73.         deskSize        : tRect;
  74.  
  75. PROCEDURE calcSlider (sl : SLIDER; pos: LONGINT);
  76.   VAR sFrame, 
  77.       pFrame : tRect;
  78. BEGIN
  79.   WITH sl^ DO 
  80.     (* calculate slider size *)
  81.     mtUtils.ObjcRect (ADR(ob), 4, sFrame);
  82.     mtUtils.ObjcRect (ADR(ob), 3, pFrame);
  83.     IF hori
  84.     THEN
  85.       IF scale > LONG(size) THEN
  86.         sFrame.w := pFrame.w;
  87.         sFrame.w := SHORT((((LONG(size)*100) DIV scale) * LONG(pFrame.w)) DIV 100);
  88.         IF sFrame.w > pFrame.w THEN sFrame.w := pFrame.w END;
  89.         IF sFrame.w < CharWidth * 2
  90.         THEN sFrame.w := CharWidth * 2 END;
  91.       ELSE
  92.         sFrame.w := pFrame.w;
  93.       END;
  94.       sFrame.x := 0;
  95.       mtUtils.SetObjcRect (ADR(ob), 4, sFrame);
  96.       IF scale > LONG(size) THEN
  97.         step := ((100*(pFrame.w-sFrame.w)) DIV SHORT(scale-LONG(size))+50 ) DIV 100;
  98.       ELSE
  99.         step := 0;
  100.       END;
  101.     ELSE
  102.       IF scale > LONG(size) THEN
  103.         sFrame.h := pFrame.h;
  104.         sFrame.h := SHORT((((LONG(size)*100) DIV scale) * LONG(pFrame.h)) DIV 100);
  105.         IF sFrame.h > pFrame.h THEN sFrame.h := pFrame.h END;
  106.         IF sFrame.h < CharHeight 
  107.         THEN sFrame.h := CharHeight END;
  108.       ELSE
  109.         sFrame.h := pFrame.h;
  110.       END;
  111.       sFrame.y := 0;
  112.       mtUtils.SetObjcRect (ADR(ob), 4, sFrame);
  113.       IF scale > LONG(size) THEN
  114.         step := ((100*(pFrame.h-sFrame.h)) DIV SHORT(scale-LONG(size))+50 ) DIV 100;
  115.       ELSE
  116.         step := 0;
  117.       END;
  118.     END;
  119.     position := pos;
  120.   END;
  121. END calcSlider;
  122.  
  123. PROCEDURE DrawSlider (sl : SLIDER; r : tRect; clip : BOOLEAN);
  124. (* Zeichnet den Slider sl im Rechtecht r (oder ganz, 
  125.  * wenn clip FALSE ist)
  126.  *)
  127. BEGIN
  128.   IF sl # NIL THEN
  129.     IF clip 
  130.     THEN
  131.       IF (r.w > 0) & (r.h > 0)
  132.       THEN
  133.         MagicAES.ObjcDraw (ADR(sl^.ob), 0, 8, r);
  134.       END;
  135.     ELSE
  136.       MagicAES.ObjcDraw (ADR(sl^.ob), 0, 8, deskSize);
  137.     END;
  138.     sl^.drawn := TRUE;
  139.   END;
  140. END DrawSlider; 
  141.  
  142. PROCEDURE CreateSlider (VAR sl : SLIDER; hor : BOOLEAN; acc : INTEGER; 
  143.                         slSize : INTEGER; slScale, slPos : LONGINT): BOOLEAN;
  144. (* Erzeugt einen neuen Slider. hori gibt an, ob es sich um einen 
  145.  * horizontalen Slider handelt, und accel gibt die Zeilenzahl beim
  146.  * scrollen an (normalerweise 1)
  147.  *)
  148.    VAR i : INTEGER;
  149.        wincol : ARRAY [0..3] OF INTEGER;
  150. BEGIN
  151.   NEW (sl);
  152.   IF sl = NIL THEN RETURN FALSE END;
  153.   WITH sl^ DO
  154.     hori := hor;
  155.     accel := acc;
  156.     scale := slScale;
  157.     position := slPos;
  158.     size     := slSize;
  159.     step     := 0;
  160.     drawn    := FALSE;
  161.     IF hori THEN
  162.       ob := horiSlidTree^;
  163.     ELSE
  164.       ob := vertSlidTree^
  165.     END;
  166.     FOR i := 0 TO 4 DO 
  167.       MagicAES.RsrcObfix (ADR (ob), i);
  168.     END;
  169.     (*
  170.     (* Jetzt noch die Farben der AES-Slider setzen *)
  171.     IF MagicAES.AESGlobal.apVersion >= $0320
  172.     THEN
  173.       (* Farben abfragen und setzen *)
  174.       IF hori
  175.       THEN
  176.         wincol[0] := MagicAES.WLFARROW;
  177.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  178.         ob[1].obSpec.Box.flags := BITSET(wincol[1]);
  179.         wincol[0] := MagicAES.WRTARROW;
  180.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  181.         ob[2].obSpec.Box.flags := BITSET(wincol[1]);
  182.         wincol[0] := MagicAES.WHSLIDE;
  183.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  184.         ob[3].obSpec.Box.flags := BITSET(wincol[1]);
  185.         wincol[0] := MagicAES.WHELEV;
  186.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  187.         ob[4].obSpec.Box.flags := BITSET(wincol[1]);
  188.       ELSE
  189.         wincol[0] := MagicAES.WUPARROW;
  190.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  191.         ob[1].obSpec.Box.flags := BITSET(wincol[1]);
  192.         wincol[0] := MagicAES.WDNARROW;
  193.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  194.         ob[2].obSpec.Box.flags := BITSET(wincol[1]);
  195.         wincol[0] := MagicAES.WVSLIDE;
  196.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  197.         ob[3].obSpec.Box.flags := BITSET(wincol[1]);
  198.         wincol[0] := MagicAES.WVELEV;
  199.         MagicAES.WindGet (0, MagicAES.WFDCOLOR, wincol);
  200.         ob[4].obSpec.Box.flags := BITSET(wincol[1]);
  201.       END;
  202.     END;
  203.     *)
  204.   END;
  205.   RETURN TRUE;
  206. END CreateSlider;
  207.  
  208. PROCEDURE FreeSlider (sl : SLIDER);
  209. (* Gibt einen Slider wieder frei. Danach darf nicht mehr
  210.  * darauf zugegriffen werden
  211.  *)
  212. BEGIN
  213.   IF sl # NIL
  214.   THEN
  215.     DISPOSE (sl);
  216.   END;
  217. END FreeSlider;
  218.  
  219. PROCEDURE SetSliderSize (sl : SLIDER; size : INTEGER);
  220. (* Setzt die Gr”že des Sliders (Anzahl der angezeigten Eintr„ge)
  221.  *)
  222. BEGIN
  223.   IF (sl # NIL) & (sl^.size # size)
  224.   THEN 
  225.     sl^.size := size;
  226.     calcSlider (sl, 0);
  227.   END;
  228. END SetSliderSize;
  229.  
  230. PROCEDURE SetSliderScale (sl : SLIDER; scale : LONGINT); 
  231. (* Setzt die Skalierung fr den Slider (Anzahl Elemente)
  232.  *)
  233. BEGIN
  234.   IF (sl # NIL) & (sl^.scale # scale)
  235.   THEN
  236.     sl^.scale := scale;
  237.     calcSlider (sl, 0);
  238.   END;
  239. END SetSliderScale;
  240.  
  241. PROCEDURE SetSliderPos (sl : SLIDER; pos : LONGINT; draw: BOOLEAN);
  242. (* Setzt die aktuelle Position des Sliders
  243.  *)
  244.   VAR scale : LONGINT;
  245. BEGIN
  246.   IF (sl # NIL) & (sl^.position # pos)
  247.   THEN
  248.     scale := sl^.scale - LONG(sl^.size);    sl^.position := pos;    IF sl^.hori    THEN      ListUtils.formSetSlider (ADR(sl^.ob), 3, 4, 0,                                scale, sl^.position, sl^.drawn & draw);    ELSE      ListUtils.formSetSlider (ADR(sl^.ob), 3, 4, 1,                                scale, sl^.position, sl^.drawn & draw);    END
  249.   END;
  250. END SetSliderPos;
  251.  
  252. PROCEDURE SliderExtents (sl : SLIDER; x, y : INTEGER; len : INTEGER; draw: BOOLEAN);
  253. (* Plaziert den Slider an die richtige Stelle
  254.  * Sollte direkt nach dem Erzeugen aufgerufen werden 
  255.  *)
  256.    VAR scl : LONGINT;
  257.        l2  : INTEGER;
  258. BEGIN
  259.   IF sl # NIL
  260.   THEN
  261.     WITH sl^ DO
  262.       (* Anpassung an 1 Pixel Rahmen der Slider-Objekte *)
  263.       INC (x);
  264.       INC (y);
  265.       DEC (len, 2);
  266.       (* Jetzt testen, ob sich was ge„ndert hat *)
  267.       IF hori THEN 
  268.         l2 := ob[0].obWidth
  269.       ELSE 
  270.         l2 := ob[0].obHeight
  271.       END;
  272.       IF (x = ob[0].obX) & (y = ob[0].obY) & (len = l2) THEN RETURN END;
  273.       (* Basisobjekt *)
  274.       ob[0].obX := x;
  275.       ob[0].obY := y;
  276.       IF hori THEN
  277.         ob[0].obWidth := len;
  278.         ob[0].obHeight := CharHeight;
  279.       ELSE
  280.         ob[0].obHeight := len;
  281.         ob[0].obWidth := CharWidth*2;
  282.       END;
  283.       (* Erster Arrow *)
  284.       ob[1].obX := 0;
  285.       ob[1].obY := 0;
  286.       ob[1].obWidth := CharWidth*2;
  287.       ob[1].obHeight := CharHeight;
  288.       (* Zweiter Arrow *)
  289.       ob[2].obWidth := CharWidth*2;
  290.       ob[2].obHeight := CharHeight;
  291.       IF hori THEN
  292.         ob[2].obX := len - CharWidth*2;
  293.         ob[2].obY := 0;
  294.         (*
  295.         ob[2].obX := (len DIV CharWidth) - 4;
  296.         ob[2].obY := 0;
  297.         *)
  298.       ELSE
  299.         (*
  300.         ob[2].obX := 0;
  301.         ob[2].obY := (len DIV CharHeight) - 2;
  302.         *)
  303.         ob[2].obX := 0;
  304.         ob[2].obY := len - CharHeight;
  305.       END;
  306.       (* Slidebar *)
  307.       IF hori THEN
  308.         ob[3].obX := CharWidth*2;
  309.         ob[3].obY := 0;
  310.         ob[3].obHeight := CharHeight;
  311.         ob[3].obWidth  := len - CharWidth*4;
  312.         (*
  313.         ob[3].obX := x+CharWidth*2;
  314.         ob[3].obY := y;
  315.         ob[3].obHeight := CharHeight;
  316.         ob[3].obWidth  := len - CharWidth*4;
  317.         *)
  318.       ELSE
  319.         ob[3].obX := 0;
  320.         ob[3].obY := CharHeight;
  321.         ob[3].obHeight := len - CharHeight*2;
  322.         ob[3].obWidth  := CharWidth*2;
  323.         (*
  324.         ob[3].obWidth  := CharWidth*2;
  325.         *)
  326.         (*
  327.         ob[3].obX := x;
  328.         ob[3].obY := y+CharHeight;
  329.         ob[3].obHeight := len - CharHeight*2;
  330.         ob[3].obWidth  := CharWidth*2;
  331.         *)
  332.       END;
  333.       
  334.       (* Slider *)
  335.       IF hori THEN
  336.         ob[4].obX := 0;
  337.         ob[4].obY := 0;
  338.         ob[4].obHeight := CharHeight;
  339.         ob[4].obWidth  := len - CharWidth*4;
  340.       ELSE
  341.         ob[4].obX := 0;
  342.         ob[4].obY := 0;
  343.         ob[4].obHeight := len - CharHeight*2;
  344.         ob[4].obWidth  := CharWidth*2;
  345.       END;
  346.       calcSlider(sl, position);
  347.       scl := scale - LONG(size);
  348.       IF hori
  349.       THEN
  350.         ListUtils.formSetSlider (ADR(ob), 3, 4, 0, 
  351.                                  scl, position, drawn & draw);
  352.       ELSE
  353.         ListUtils.formSetSlider (ADR(ob), 3, 4, 1, 
  354.                                  scl, position, drawn & draw);
  355.       END;
  356.     END;
  357.   END; (* IF sl # NIL *)
  358. END SliderExtents;
  359.  
  360. PROCEDURE formSlider (sl : SLIDER; update : updateProc);
  361.     VAR newPos  : INTEGER;
  362.         newVal  : LONGINT;
  363.  
  364.         pAbsFrame,
  365.         sAbsFrame,
  366.         oldsFrame,
  367.         pFrame,
  368.         sFrame,
  369.         xFrame  : tRect;
  370.  
  371.         xOff,
  372.         yOff    : INTEGER;
  373.         X, Y, W, H    : INTEGER;
  374.         mrect   : tRect;
  375.         mess : ADDRESS;
  376.         evnt : BITSET;
  377.         button,
  378.         kstate  : BITSET;
  379.         ch      : CHAR;
  380.         faktor  : INTEGER;
  381.         oldStart : LONGINT;
  382.         dial    : ADDRESS;
  383.         Epp     : LONGINT;
  384.         
  385.   BEGIN
  386.     dial := ADR(sl^.ob);
  387.     mtUtils.ObjcArea (dial, parent, pAbsFrame);
  388.     mtUtils.ObjcArea (dial, slider, sAbsFrame);
  389.     ListUtils.CalcAbsArea (dial, slider, xFrame);
  390.  
  391.     mtUtils.ObjcRect (dial, parent, pFrame);
  392.     mtUtils.ObjcRect (dial, slider, sFrame);
  393.     oldsFrame := sFrame;
  394.     
  395.     mtAppl.MouseHand();
  396.     oldStart := sl^.position;
  397.     newVal := oldStart;
  398.     MagicAES.GrafMkstate (X, Y, button, kstate);
  399.     xOff := X - sAbsFrame.x-1;
  400.     yOff := Y - sAbsFrame.y-1;
  401.     LOOP
  402.       (* ersetzt durch evnt-Multi  *)
  403.       MagicAES.GrafMkstate (X, Y, button, kstate);
  404. (*    
  405.       WITH mrect DO
  406.         x := X;
  407.         y := Y;
  408.         w := 1;
  409.         h := 1;
  410.       END;
  411.       evnt := MagicAES.EvntMulti ({MagicAES.MUBUTTON, MagicAES.MUM1},
  412.                                   1,{0},{}, MagicAES.LeaveRect, mrect, 0, mrect, mess, 0, 0,
  413.                                   X, Y, button, faktor, kstate, faktor, ch, faktor);
  414.       IF MagicAES.MUBUTTON IN evnt
  415.       THEN
  416.         IF ~(0 IN button) THEN EXIT END;
  417.       END;
  418. *)
  419.       IF ~(0 IN button) THEN EXIT END;
  420.  
  421.       WITH sl^ DO
  422.         IF ~hori
  423.         THEN
  424.           IF pAbsFrame.h <= sAbsFrame.h 
  425.           THEN
  426.             newVal := 0
  427.           ELSE
  428.           (*
  429.             Epp := ((scale-LONG(size)) * 1000L) DIV LONG(pFrame.h - sFrame.h);
  430.             newVal := ((LONG(Y - yOff - pAbsFrame.y) * Epp) DIV 1000L);
  431.           *)
  432.             newVal := (LONG(Y - yOff - pAbsFrame.y) * (scale-LONG(size))*1000L) DIV (LONG(pAbsFrame.h - sAbsFrame.h) * 1000L);
  433.             newVal := BinOps.LowerLInt (newVal, scale - LONG(size) );
  434.             newVal := BinOps.HigherLInt (newVal, 0);
  435.           END;
  436.           IF sl^.accel > 0 
  437.           THEN
  438.             newVal := (newVal DIV LONG(sl^.accel)) * LONG(sl^.accel);
  439.           END;
  440.         ELSE
  441.           IF pFrame.w <= sFrame.w
  442.           THEN
  443.             newVal := 0;
  444.           ELSE
  445.             newVal := (LONG(X - xOff - pAbsFrame.x) * (scale-LONG(size))*1000L) DIV (LONG(pAbsFrame.w - sAbsFrame.w) * 1000L);
  446.             newVal := BinOps.LowerLInt (newVal, scale - LONG(size));
  447.             newVal := BinOps.HigherLInt (newVal, 0);
  448.           END;
  449.           IF sl^.accel > 0 
  450.           THEN
  451.             newVal := (newVal DIV LONG(sl^.accel)) * LONG(sl^.accel);
  452.           END;
  453.         END;
  454.       END;
  455.       
  456.       (* Slider neu zeichnen und Liste updaten *)
  457.       IF newVal # oldStart THEN 
  458.         update (sl, newVal); 
  459.         oldStart := newVal;
  460.         SetSliderPos (sl, newVal, TRUE);
  461.       END;
  462.  
  463.     END; (* LOOP *)
  464.     mtAppl.MouseArrow();
  465.     sl^.position := newVal;
  466.   END formSlider;
  467.  
  468. PROCEDURE SelectButton (adr: ADDRESS; objc: INTEGER; doSel: BOOLEAN);
  469.   VAR r : mtUtils.tRect;
  470. BEGIN
  471.   mtUtils.SetState (adr, objc, MagicAES.SELECTED, doSel);
  472.   mtUtils.CalcArea (adr, objc, r);
  473.   MagicAES.ObjcDraw (adr, 0, 2, r);
  474. END SelectButton;
  475.  
  476. PROCEDURE SliderClick (sl : SLIDER; x, y : INTEGER; clicks : INTEGER; update: updateProc) : LONGINT; 
  477. (* In: Mauskoordinate. Out: Neue Position. Bei einem Mausklick
  478.  * aužerhalb des Sliders wird -1 zurckgegeben
  479.  *)
  480.  VAR objc : INTEGER;
  481.      kstate,
  482.      buts : BITSET;
  483.      r    : tRect;
  484.      newPos,
  485.      oldPos: LONGINT;
  486. BEGIN
  487.   IF (sl # NIL) OR (clicks = 0)
  488.   THEN
  489.     WITH sl^ DO
  490.       objc := MagicAES.ObjcFind (ADR(ob), 0, 8, x, y);
  491.       IF objc > 0 
  492.       THEN
  493.         (* Klick behandeln *)
  494.         CASE objc OF
  495.           1 : (* Up- bzw. Leftarrow *) 
  496.               SelectButton (ADR(ob), objc, TRUE);
  497.               oldPos := position;
  498.               newPos := position;
  499.               IF clicks > 1 THEN newPos:= 0 END;
  500.               REPEAT
  501.                 DEC (newPos, accel);
  502.                 IF newPos < 0 THEN newPos := 0 END;
  503.                 IF newPos # oldPos
  504.                 THEN
  505.                   update (sl, newPos);
  506.                   SetSliderPos (sl, newPos, TRUE);
  507.                 END;
  508.                 oldPos := newPos;
  509.                 MagicAES.GrafMkstate (x, y, buts, kstate);
  510.               UNTIL ~(0 IN buts);
  511.               SelectButton (ADR(ob), objc, FALSE);
  512.               |
  513.           2 : (* Down- bzw. Rightarrow *) 
  514.               SelectButton (ADR(ob), objc, TRUE);
  515.               oldPos := position;
  516.               newPos := position;
  517.               IF clicks > 1 THEN newPos := scale - LONG(size) END;
  518.               REPEAT 
  519.                 INC (newPos, accel);
  520.                 IF newPos > scale - LONG(size) THEN newPos := scale - LONG(size) END;
  521.                 IF newPos # oldPos
  522.                 THEN
  523.                   update (sl, newPos);
  524.                   SetSliderPos (sl, newPos, TRUE);
  525.                 END;
  526.                 oldPos := newPos;
  527.                 MagicAES.GrafMkstate (x, y, buts, kstate);
  528.               UNTIL ~(0 IN buts);
  529.               SelectButton (ADR(ob), objc, FALSE);
  530.               |
  531.           3 : (* Slidebar *)
  532.               mtUtils.CalcArea (ADR(ob), 4, r);
  533.               oldPos := position;
  534.               newPos := position;
  535.               IF (hori & (x < r.x)) OR (~hori & (y < r.y))
  536.               THEN
  537.                 REPEAT 
  538.                   (* Page Up/Right *)
  539.                   DEC (newPos, size);
  540.                   IF newPos < 0 THEN newPos := 0 END;
  541.                   IF newPos # oldPos
  542.                   THEN
  543.                     update (sl, newPos);
  544.                     SetSliderPos (sl, newPos, TRUE);
  545.                   END;
  546.                   oldPos := newPos;
  547.                   MagicAES.GrafMkstate (x, y, buts, kstate);
  548.                 UNTIL ~(0 IN buts);
  549.               ELSE
  550.                 REPEAT 
  551.                   (* Page Down/Left *)
  552.                   INC (newPos, size);
  553.                   IF newPos > scale - LONG(size)
  554.                   THEN
  555.                     newPos := scale - LONG(size);
  556.                   END;
  557.                   IF newPos # oldPos
  558.                   THEN
  559.                     update (sl, newPos);
  560.                     SetSliderPos (sl, newPos, TRUE);
  561.                   END;
  562.                   oldPos := newPos;
  563.                   MagicAES.GrafMkstate (x, y, buts, kstate);
  564.                 UNTIL ~(0 IN buts);
  565.               END;
  566.               | 
  567.           4 : (* Slider *)
  568.               formSlider (sl, update);
  569.               |
  570.         ELSE
  571.         END;
  572.         (*
  573.         update (sl, position);
  574.         *)
  575.         RETURN position;
  576.       ELSE
  577.         RETURN -1
  578.       END;
  579.     END;
  580.   END;
  581.   RETURN -1;
  582. END SliderClick;
  583.  
  584. VAR rsc : mtRsc.RESOURCE;
  585.     data: POINTER TO tRscData;
  586.  
  587. BEGIN
  588.   (* Modulinterne Resource laden *) 
  589.   (* Erstmal Resource kopieren in allozierten Speicher *)
  590.   ALLOCATE (data, TSIZE (tRscData));
  591.   IF data = NIL THEN HALT END; (* Kein Speicher frei *)
  592.   (* Kopieren *)
  593.   data^ := RscData;
  594.   (* und jetzt relozieren *)
  595.   IF mtRsc.RelocRsc (data, rsc) THEN 
  596.  
  597.     vertSlidTree := mtRsc.GaddrRsc (rsc, MagicAES.RTREE, Form1);
  598.     horiSlidTree := mtRsc.GaddrRsc (rsc, MagicAES.RTREE, Form2);
  599.   ELSE
  600.     HALT;       (* Relozieren der internen Ressource fehlgeschlagen, 
  601.                  * sollte aber eigentlich nicht vorkommen
  602.                  *)
  603.   END;
  604.   deskSize := tRect{mtAppl.DeskX, mtAppl.DeskY, mtAppl.MaxWidth, mtAppl.MaxHeight};
  605. END DialSlider.